<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>Fusyōn. - Le cadavre exquis boira le vin nouveau.</title><meta name="author" content="i4N"><meta name="copyright" content="i4N"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta property="og:type" content="website">
<meta property="og:title" content="Fusyōn.">
<meta property="og:url" content="http://jav1ki4n.github.io/index.html">
<meta property="og:site_name" content="Fusyōn.">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="http://jav1ki4n.github.io/img/i4N.png">
<meta property="article:author" content="i4N">
<meta property="article:tag" content="embedded,STM32">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http://jav1ki4n.github.io/img/i4N.png"><script type="application/ld+json">{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Fusyōn.",
  "alternateName": [
    "Le cadavre exquis boira le vin nouveau.",
    "jav1ki4n.github.io"
  ],
  "url": "http://jav1ki4n.github.io/"
}</script><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="http://jav1ki4n.github.io/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css?v=5.5.1"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.1.0/css/all.min.css"><script>
    (() => {
      
    const saveToLocal = {
      set: (key, value, ttl) => {
        if (!ttl) return
        const expiry = Date.now() + ttl * 86400000
        localStorage.setItem(key, JSON.stringify({ value, expiry }))
      },
      get: key => {
        const itemStr = localStorage.getItem(key)
        if (!itemStr) return undefined
        const { value, expiry } = JSON.parse(itemStr)
        if (Date.now() > expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return value
      }
    }

    window.btf = {
      saveToLocal,
      getScript: (url, attr = {}) => new Promise((resolve, reject) => {
        const script = document.createElement('script')
        script.src = url
        script.async = true
        Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val))
        script.onload = script.onreadystatechange = () => {
          if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve()
        }
        script.onerror = reject
        document.head.appendChild(script)
      }),
      getCSS: (url, id) => new Promise((resolve, reject) => {
        const link = document.createElement('link')
        link.rel = 'stylesheet'
        link.href = url
        if (id) link.id = id
        link.onload = link.onreadystatechange = () => {
          if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve()
        }
        link.onerror = reject
        document.head.appendChild(link)
      }),
      addGlobalFn: (key, fn, name = false, parent = window) => {
        if (!false && key.startsWith('pjax')) return
        const globalFn = parent.globalFn || {}
        globalFn[key] = globalFn[key] || {}
        globalFn[key][name || Object.keys(globalFn[key]).length] = fn
        parent.globalFn = globalFn
      }
    }
  
      
      const activateDarkMode = () => {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      const activateLightMode = () => {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }

      btf.activateDarkMode = activateDarkMode
      btf.activateLightMode = activateLightMode

      const theme = saveToLocal.get('theme')
    
          theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null
        
      
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide')
      }
    
      
    const detectApple = () => {
      if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) {
        document.documentElement.classList.add('apple')
      }
    }
    detectApple()
  
    })()
  </script><script>const GLOBAL_CONFIG = {
  root: '/',
  algolia: undefined,
  localSearch: undefined,
  translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
  highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":true},
  copy: {
    success: '复制成功',
    error: '复制失败',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '',
  dateSuffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'null',
  Snackbar: undefined,
  infinitegrid: {
    js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid@4.12.0/dist/infinitegrid.min.js',
    buttonText: '加载更多'
  },
  isPhotoFigcaption: false,
  islazyloadPlugin: false,
  isAnchor: false,
  percent: {
    toc: true,
    rightside: false,
  },
  autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: 'Fusyōn.',
  isHighlightShrink: false,
  isToc: false,
  pageType: 'home'
}</script><meta name="generator" content="Hexo 8.0.0"></head><body><div class="page" id="body-wrap"><header class="full_page fixed" id="page-header" style="background-image: url(/img/bck.png);"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/img/i4N_small.png" alt="Logo"><span class="site-name">Fusyōn.</span></a></span><div id="menus"></div></nav><div id="site-info"><h1 id="site-title">Fusyōn.</h1></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts nc" id="recent-posts"><div class="recent-post-items"><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/11/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%20%E6%9C%88%E5%BA%A6%E8%AE%B0%E5%BD%95%20%E5%85%B6%E5%8D%81/" title="二〇二五 月度记录 其十">二〇二五 月度记录 其十</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-11-01T07:52:34.638Z" title="发表于 2025-11-01 15:52:34">2025-11-01</time></span></div><div class="content"> OctoberOct.1st ~ Oct.6th 家中摆烂。 将驱动用 C++ 部分重构了一遍，但是 Keil Assistant 配合编译器使用总是会报各种各样的错误，而且使用 Keil 实在令人抓耳挠腮，遂想要重新配一个独立的工具链。  Oct.7th 咨询了一下土澳和加拿大留学的相关事宜，大概梳理了一下后续的一年多时间应该要做什么。总之先找到老师进组科研吧。 配置工具链。  Oct.8th 配置好了工具链，在 STM32F411CEU6 下进行了验证。  1CubeMx - MSYS2 - arm-none-eabi-gcc - ninja - openocd   Oct. 9th ~ Oct.13thC mixing with C++ 出了问题。 萎靡不振。 Oct.13th ~ Oct.15th将博客重建了一下，主题换成了 Butterfly ，各种资源先轻量化一点，日后再修缮。 换到了 Clion 上解决了部分工具链配置上的问题，但是这一块混合编译的信息量真的不小。回归嵌入式之后 C++ 这边暂时没有学新的特性了，一边实践一边理解吧。 Oct.16 - Oct.20...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/10/21/%E5%BE%AE%E6%9C%BA%E6%80%BB%E7%BB%93/" title="微机原理（LEGACY）">微机原理（LEGACY）</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-10-20T16:05:17.811Z" title="发表于 2025-10-21 00:05:17">2025-10-21</time></span></div><div class="content"> 定时器8253 初始化首先计算计数初值，晶振频率为 $F_{osc}$，目标信号频率是 $f$ 计数初值绝对是大于1的，也就是 $$N &#x3D; \frac{F_{osc}}{f}$$如果计数器计数初值超过 FFFFH，说明 Fosc 太大，可以多设置一个定时器，用那个定时器的 OUT 代替晶振作为超过限制计数器的 CLK信号输入： $$ N &#x3D; \frac{f_{new}}{f} $$ 配置一个定时 &#x2F; 计数器： 12345678CONFIG:	MOV DX &lt;控制字地址，一般是最后的端口地址&gt;	MOV AL &lt;控制字内容，包括 选中哪个定时器 以及 定时器的工作方式 (输出波形)&gt;	OUT DX AL	MOV DX &lt;定时器的数据输入地址，一般是前三个端口地址，按 T0,T1,T2&gt;	MOV AL &lt;计数初值 N，16位一次装填就可以&gt; 	OUT DX AL  配置 n 个： 123CONFIG1 - 按照上面的格式CONFIG2CONFIG3   80C51 初始化首先计算初值，晶振不能直接用。 需要...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/10/21/%E5%BE%AE%E6%9C%BA%E5%8E%9F%E7%90%86/" title="微机原理(LEGACY)">微机原理(LEGACY)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-10-20T16:05:17.808Z" title="发表于 2025-10-21 00:05:17">2025-10-21</time></span></div><div class="content"> Von Noemann 计算机核心思想：存储程序控制  程序由按序排列的指令组成，保存在 存储器 之中 指令和数据由 二进制 编码 指令的执行按照 在存储器中的存储顺序 控制器控制程序与数据的 存取，也控制 执行 所有的执行经过运算器，运算器是核心。  从真值到其他码制   极性 真值 原码 反码 补码 移码 &#x2F; 增码    + +数值 0+数值 与原码相同 与原码相同 补码符号位取反   - -数值 1+数值 除符号位1以外全部取反 反码+1 补码符号位取反     若要从 N 的 补码 得到 -N 的 补码，对 ±N 的 补码 包括符号位在内 的所有位取反后+1（0x01）即可。N 的极性不作规定。  如果采用 $[-N]_{原}$  的表示方法，此时正数与负数的符号位交换（也就是正数的符号位变成1），那么表格中的极性也应当交换。    有关小数的码制表示：    真值 原码 解释    +0.1001 0.1001 小数的整数位是0，在进行转换时符号位直接占据了这一位置   - 0.1001 1.1001 由于负数是1，这里看的更加明显   基于补码的运算手段补...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/10/13/%E5%9C%A8%20Clion%20%E4%B8%AD%E4%BD%BF%E7%94%A8C%E4%B8%8EC++%E6%B7%B7%E5%90%88%E5%BC%80%E5%8F%91%20STM32/" title="在 Clion 中使用 C/C++ 混合开发 STM32">在 Clion 中使用 C/C++ 混合开发 STM32</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-10-13T12:23:15.899Z" title="发表于 2025-10-13 20:23:15">2025-10-13</time></span></div><div class="content"> 1. 混合C &#x2F; C++1.1. C 与 C++ 的相互包含关系C++ 可以包含 C 的头文件与代码，因为其本身类似 C 的超集，然而对于一个 C 文件，其无法直接引用 C++ 的头文件或者函数，当编译一个 C 文件的时候，由于 gcc 不能识别 C++ 语法，所以会报错。 比如，main.c 引用了含有 C++ 语法的 mycpp.h 时就会出现错误。 如果要使这个 .h 文件能够成功被 gcc 解析，就需要用到一对 C++ 宏： 1234//mycpp.h#ifdef __cplusplusvoid foo();#endif  我们假设 foo() 是一个 C++ 函数，当在 main.c 的编译单元里编译时， gcc 由于宏 __cplusplus 并没有被定义，所以 #ifdef 和 #endif 条件为假，void foo() 不会被执行，也就避免了在 C 文件中引入 C++ 的特性，也就是等效于： 12//mycpp.h//void foo();  对于 gcc 来说，这没有任何问题。 从中可以总结几个地方：  任何包含 C++ 特性的 函数 &#x2F;...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/10/12/2025/" title="2025 月度记录 其九">2025 月度记录 其九</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-10-12T06:25:58.373Z" title="发表于 2025-10-12 14:25:58">2025-10-12</time></span></div><div class="content"> SeptemberSep.25th 补充了 C++ 中有关字符串的一些小知识： 传参时的空格问题 - std::ws 以及 cin.ignore() 作为入口参数时使用 std::string_view 来节省性能开销 了解了一下字面值 std::string_literal，一般可以直接将 C  风格字符串直接转为 string 对象，但我觉得可能不是很常用。     Sep.26th 补充了 C++ 中有关变量和运算的一些小知识：  静态转换 static_cast （对比强制转换） 常量表达式 constexpr 与 const 的适用场合，我暂时没想到我该怎么用。 位运算对象 bitset （不错）   了解了命名空间 namespace，包括其与子级的创建与调用。  前向声明 ( forward declartion ) 允许不定义函数就调用，但是包含这个函数定义的文件必须也参与编译。  inline 修饰符允许函数在单独的头文件中直接 定义， 并且被多个 cpp 文件调用。 在旧版本 C++ 中，这个修饰符的作用是将函数调用改为直接执行函数的代码段以节省开销，现代 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/10/12/C%20%E4%B8%8E%20C++%20%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90/" title="C/C++：随机数生成">C/C++：随机数生成</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-10-11T16:39:32.613Z" title="发表于 2025-10-12 00:39:32">2025-10-12</time></span></div><div class="content"> 1. C-style12345678910#include &lt;iostream&gt;#include &lt;ctime&gt;int Generate_RandomNumber()&#123;	srand(time(0));	int num = rand()%100 + 1;		return num&#125;  srand() 用于生成伪随机数生成器 PRNG 的种子，不同的种子会生成不同的随机序列，这里引用 ctime 库提供了函数 time() ，用于获取当前（当入口参数为 NULL 时）系统时间戳作为随机种子，在每次程序编译的时候时间都不一样，所以能够保证生成的随机数也不一样。 rand() 返回 0 - RAND_MAX 内的随机正整数，这个上限数值取决于编译器实现，在我的 64位 Windows 系统下，stdlib 库中定义 1#define RAND_MAX 0x7fff`  即 32767。 如果需要进行范围限制，比如可以： 1rand() % 100  这个取余的结果范围在 0 - 99 ,也就是说  1rand() % N  生成 0 ~ (N-...</div></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info text-center"><div class="avatar-img"><img src="/img/i4N.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info-name">i4N</div><div class="author-info-description"></div><div class="site-data"><a href="/archives/"><div class="headline">文章</div><div class="length-num">6</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">0</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/jav1ki4N"><i class="fab fa-github"></i><span>Github</span></a></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>关于 / Aboout</span></div><div class="announcement_content">Ain't nothing new here</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/11/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%20%E6%9C%88%E5%BA%A6%E8%AE%B0%E5%BD%95%20%E5%85%B6%E5%8D%81/" title="二〇二五 月度记录 其十">二〇二五 月度记录 其十</a><time datetime="2025-11-01T07:52:34.638Z" title="发表于 2025-11-01 15:52:34">2025-11-01</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/10/21/%E5%BE%AE%E6%9C%BA%E6%80%BB%E7%BB%93/" title="微机原理（LEGACY）">微机原理（LEGACY）</a><time datetime="2025-10-20T16:05:17.811Z" title="发表于 2025-10-21 00:05:17">2025-10-21</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/10/21/%E5%BE%AE%E6%9C%BA%E5%8E%9F%E7%90%86/" title="微机原理(LEGACY)">微机原理(LEGACY)</a><time datetime="2025-10-20T16:05:17.808Z" title="发表于 2025-10-21 00:05:17">2025-10-21</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/10/13/%E5%9C%A8%20Clion%20%E4%B8%AD%E4%BD%BF%E7%94%A8C%E4%B8%8EC++%E6%B7%B7%E5%90%88%E5%BC%80%E5%8F%91%20STM32/" title="在 Clion 中使用 C/C++ 混合开发 STM32">在 Clion 中使用 C/C++ 混合开发 STM32</a><time datetime="2025-10-13T12:23:15.899Z" title="发表于 2025-10-13 20:23:15">2025-10-13</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/10/12/2025/" title="2025 月度记录 其九">2025 月度记录 其九</a><time datetime="2025-10-12T06:25:58.373Z" title="发表于 2025-10-12 14:25:58">2025-10-12</time></div></div></div></div><div class="card-widget card-archives">
    <div class="item-headline">
      <i class="fas fa-archive"></i>
      <span>归档</span>
      
    </div>
  
    <ul class="card-archive-list">
      
        <li class="card-archive-list-item">
          <a class="card-archive-list-link" href="/archives/2025/11/">
            <span class="card-archive-list-date">
              十一月 2025
            </span>
            <span class="card-archive-list-count">1</span>
          </a>
        </li>
      
        <li class="card-archive-list-item">
          <a class="card-archive-list-link" href="/archives/2025/10/">
            <span class="card-archive-list-date">
              十月 2025
            </span>
            <span class="card-archive-list-count">5</span>
          </a>
        </li>
      
    </ul>
  </div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">6</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2025-11-01T09:27:35.301Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div class="footer-other"><div class="footer-copyright"><span class="copyright">&copy;&nbsp;2025 By i4N</span><span class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo 8.0.0</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly 5.5.1</a></span></div><div class="footer_custom_text">Le cadavre exquis boira le vin nouveau.</div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="translateLink" type="button" title="简繁转换">繁</button><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js?v=5.5.1"></script><script src="/js/main.js?v=5.5.1"></script><script src="/js/tw_cn.js?v=5.5.1"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>